/**
 * 黄浩华封装的微信分享接口
 * */
(function () {
    //在这里定义分享的内容
    var initUrl = '',
        hasInit = false,//是否注册成功微信js了
        fns = [],//用于存储未注册微信js前调用的函数
        doingActions = {},//有的接口正在调用时不允许再次调用的,如果正在调用,会到这存一个值
        jsApiList = ['chooseWXPay','chooseImage','uploadImage',"onMenuShareTimeline","onMenuShareAppMessage",'onMenuShareQQ','onMenuShareWeibo','onMenuShareQZone'],
        weChat_js;

    weChat_js = {

        /**
         * 外面调用这个就可以设置分享,调用这个之后也要等到微信api注册成功之后才生效的。
         * */
        share:function(data){
            var self = this;
            if(!hasInit){
                fns.push(function(){
                    self.share(data);
                });
                return;
            }

            data = data || {
                    title: document.title, // 分享标题 老用户就是有特权！10万份红利，5千杯星巴克，尽情摇！
                    desc: document.title, // 分享描述
                    link: location.href, // 分享链接
                    imgUrl: function () {
                        var imgs = $('img');
                        if(imgs[0]){
                            var src = imgs[0].src;
                            return src.indexOf('http')===0?src:location.origin+location.pathname+src;
                        }else{
                            return location.origin+location.pathname+'images/nazou_logo.png';
                        }
                    }()
                };

            //分享朋友
            wx.onMenuShareAppMessage(data);
            //分享朋友圈
            wx.onMenuShareTimeline(data);
            //分享到QQ
            wx.onMenuShareQQ(data);
            //分享到腾讯微博
            wx.onMenuShareWeibo(data);
            //分享到QQ空间
            wx.onMenuShareQZone(data);
        },

        /**
         * 打开微信支付窗口
         * @param data obj
         * @param data.pack string 统一支付接口返回的prepay_id参数值，提交格式如：prepay_id=***）
         * @param data.nonceStr string 支付签名随机串，不长于 32 位
         * @param data.paySign string 采用统一的微信支付 Sign 签名生成方法，注意这里 appId 也要参与签名，
         *                          appId 与 config 中传入的 appId 一致，
         *                          即最后参与签名的参数有 appId, timeStamp, nonceStr, package, signType
         * @param data.signType string 签名方式，默认为'SHA1'，使用新版支付需传入'MD5'
         * @param data.timestamp int 支付签名时间戳，注意微信jssdk中的所有使用timestamp字段均为小写。
         *                          但最新版的支付后台生成签名使用的timeStamp字段名需大写其中的S字符
         * @param success string 支付成功后的回调函数,第一个参数是数字:1成功支付,2用户取消了,0遇到bug。第二个参数是微信传回的原始参数
         * */
        chooseWXPay:function (data,success){
            var self = this;
            if(!hasInit){
                fns.push(function(){
                    self.chooseWXPay(data,success);
                });
                return;
            }

            if(success){
                data.success = function(res){
                    if(res.errMsg == "chooseWXPay:ok"){
                        success(1,res);
                    }else if(res.errMsg=='chooseWXPay:cancel'){
                        //用户取消了
                        success(2,res);
                    }else {
                        success(0,res);
                    }
                };
                data.fail = function (res) {
                    success(0,res);
                }
            }
            wx.chooseWXPay(data);
        },

        //注册微信js
        init:function(){
            if(hasInit)
                return;

            var url = encodeURIComponent(location.href.split('#')[0]),
                self = this;

            ajax(
                'http://nazou.api.189goo.cn/nazou.php?url='+url+'&t='+(new Date().getTime()),
                function(data){
                    data = JSON.parse(data);
                    wx.ready(function(){
                        hasInit = true;
                        runFnsInQueue();
                    });
                    wx.error(function(res){
                        console.log("error")
                    });

                    wx.config({
                        debug: location.href.indexOf('test')>=8,
                        appId: data.appid||'wxe4a8131afff0ef9d',
                        //appId: 'wxe4a8131afff0ef9d',
                        timestamp: data.timestamp,
                        nonceStr: data.noncestr,
                        signature: data.signature,
                        jsApiList: jsApiList
                    });
                }
            );
        }
    };

    //执行在队列中的函数,因为有可能外部在js接口未注册成功时调用微信接口。
    function runFnsInQueue() {
        if(hasInit&&fns.length){
            for(var i=0,fNum=fns.length;i<fNum;i++){
                if(!fns.length)
                    break;

                var fn = fns.shift();
                if(fn&&typeof fn=='function'){
                    fn();
                }
            }
        }
    }
    /**
     * 原生ajax请求
     * @param url String 响应请求的链接
     * @param options object/Function
     * @param options.args Object 传给服务器的参数，也可以使用String，但是内容要用键值对的方式写好，参数之间用&
     * @param options.method String 值："POST"或"GET"。默认：如果有args值就是POST，没有就GET
     * @param options.complete Function 成功或者失败都回调的函数
     * @param options.cache Boolean 是否缓存
     * @param options.dataFormat String 值："JSON": 返回 JSON 数据,"String": 返回 String 数据(ps.现在返回的数据都是原始数据，不会给你转的！)
     *
     * ps.输出的数据可能需要手动转换成json：var data = JSON.parse(data);
     */
    function ajax(url,options){
        var req = new XMLHttpRequest(),
            complete = options.complete||options,
            method = options.method||"POST",
            dataFormat = options.dataFormat||'JSON',
            cache = options.cache||true,
            args = options.args||'';

        url = url+(cache?'':((url.indexOf('?')>=0?'&':'?')+"random="+Math.random()));

        if(complete){
            req.onreadystatechange = function(){
                if (req.readyState==4 && req.status==200){
                    //晚一些用try...catch来判断数据格式
                    //var reData = req.responseText;
                    //if(dataFormat=='JSON')reData = JSON.parse(reData);//JSON.stringify()
                    complete(req.responseText);
                    //complete.apply(null,[req.responseText]);
                }
                //else console.log('[Hquery]请求未完成或者出错:',req);
            }
        }
        req.open(method,url,true);
        var argString;
        if(args){
            req.setRequestHeader("Content-type","application/x-www-form-urlencoded");
            argString = '';
            if(typeof args=='string'){
                argString = args;
            }else{
                for(var key in args){
                    if(!(args[key]===undefined||args[key]===null))
                        argString += key + '=' + encodeURIComponent(args[key]) + '&';
                }
            }
            argString = argString.replace(/(^&+)|(&+$)/g,'');//去掉前后的&符号
        }
        req.send(argString);
    }


    weChat_js.init();
    
    window.HWechatJs = weChat_js;

}());